/**
 * Copyright (c) 2009 blurredVision
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
 * associated documentation files (the "Software"), to deal in the Software without restriction, 
 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or 
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
 * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
#ifndef __IMATERIAL_H__
#define __IMATERIAL_H__

#pragma once
#include "geom/Vector.h"
#include "IResource.h"


/**
 * \ingroup CoreEngine
 *
 * The IMaterial interface.<br>
 * An material is a surface property for a renderable object in the scene.<br>
 * Used by the fixed function pipeline.<br>
 * A IMaterial instance is created by calling ResourceFactory::createMaterial()<br>
 * For more sophisticated materials see IShaderEffect.
 *
 * \date 04-01-2007
 *
 * \author juckel
 *
 */
class DLL_EXPORT IMaterial
	: public IResource
{
public:
	/// Creates a new material and returns the pointer
	static IMaterial* Create();

	virtual ~IMaterial(void);

	/// Binds the material for use
	virtual bool bind() = 0;
	/// Ends the use of the material
	virtual bool unbind() = 0;

	/// Set the diffuse color
	virtual void setDiffuse(const math::Vector4 &color) = 0;
	
	/// Set the ambient color
	virtual void setAmbient(const math::Vector4 &color) = 0;

	/// Set the specular color
	virtual void setSpecular(const math::Vector4 &color) = 0;

	/// Set the emissive color
	virtual void setEmissive(const math::Vector4 &color) = 0;

	/// Set the power
	virtual void setPower(float power) = 0;

	virtual unsigned int getType() { return RESTYPE_MATERIAL; };

protected:
	IMaterial(void);
};

#endif
